﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GcmpModelInterface.h"
#include "IDbObject.h"

namespace gcmp
{
    class IDocument;
    class IElement;
    class Coordinate3d;
    class Matrix4d;
    class Vector3d;
    class IGeometry;
    class IPositionAssociatedPlane;
    /// \brief 几何定位接口基类
    class GCMP_MODEL_INTERFACE_EXPORT IPositionGeometry : public IDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IPositionGeometry, gcmp::IDbObject)
    public:
        /// \brief 克隆几何定位对象
        /// \return 克隆后的几何定位对象
        virtual OwnerPtr<IPositionGeometry> Clone() const = 0;

        /// \brief 设置该行为所属Element
        /// \param pOwnerElement 所属Element
        /// \return bool
        virtual bool SetOwnerElement(IElement* pOwnerElement) = 0;

        /// \brief 获得该行为所属的Element
        /// \return 所属的Element
        virtual IElement* GetOwnerElement() = 0;

        /// \brief 获得该行为所属的Element
        /// \return 所属的Element
        virtual const IElement* GetOwnerElement() const = 0;

        /// \brief 得到世界坐标系下的点坐标系集合
        /// \return 点坐标系集合
        virtual std::vector<Coordinate3d> GetWorldCoordinateSystems() const = 0;

        /// \brief 得到局部坐标系下的点坐标系集合
        /// \return 点坐标系集合
        virtual std::vector<Coordinate3d> GetLocalCoordinateSystems() const = 0;

        /// \brief 计算定位中局部坐标系到世界坐标系下的转换矩阵
        /// \return 转换矩阵
        virtual Matrix4d ComputeLocalToWorldCoordinateSystemTransformMatrix() const = 0;

        /// \brief 得到控制点个数
        /// \return 控制点个数
        virtual int GetControlPointCount() const = 0;

        /// \brief 通过控制点索引得到世界坐标系上的坐标点
        /// \param index 控制点索引
        /// \return 世界坐标系上的坐标点
        virtual Vector3d GetPointByIndex(int index) const = 0;

        /// \brief 通过控制点索引设置控制点在世界坐标系上的坐标点
        /// \param index 控制点索引
        /// \param postion 世界坐标系上的坐标点
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetPointByIndex(int index, const Vector3d& postion) = 0;

        /// \brief 执行移动操作
        /// \param moveDirection 移动方向向量
        /// \return 返回true表示成功执行移动操作，否则表示失败 
        virtual bool Translate(const Vector3d& moveDirection) = 0;

        /// \brief 执行矩阵转换操作
        /// \param matrix 转换矩阵
        /// \return 返回true表示成功矩阵转换操作，否则表示失败 
        virtual bool Transform(const Matrix4d& matrix) = 0;

        /// \brief 设置基准几何，如二维线、三维线等
        /// \param pGeometry 基准几何
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetGeometry(const IGeometry* pGeometry) = 0;

        /// \brief 获取基准几何，如二维线、三维线等
        /// \return 返回基准几何
        virtual const IGeometry* GetGeometry() const = 0;

        /// \brief 是否允许和此关联平面定位组合
        ///
        /// 在和关联平面定位组合来创建IElementPosition的时候会检查该组合是否允许
        /// \param pPositionAssociatedPlane 关联平面定位
        /// \return 返回true表示允许，否则表示不允许 
        virtual bool AllowPositionAssociatedPlane(const IPositionAssociatedPlane* pPositionAssociatedPlane) const = 0;
    };
}



